package pe.edu.upc.jtigers.svpn.web.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Collection;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import pe.edu.upc.jtigers.svpn.aplication.bean.FiltroPlanBean;
import pe.edu.upc.jtigers.svpn.data.Constans.MenuConstans;
import pe.edu.upc.jtigers.svpn.data.Constans.TipoUsuarioConstans;
import pe.edu.upc.jtigers.svpn.domain.model.Categoria;
import pe.edu.upc.jtigers.svpn.domain.model.PlanNegocio;
import pe.edu.upc.jtigers.svpn.domain.service.CategoriaService;
import pe.edu.upc.jtigers.svpn.domain.service.PlanNegocioService;
import pe.edu.upc.jtigers.svpn.domain.service.SabioService;
import pe.edu.upc.jtigers.svpn.web.common.BaseController;
import pe.edu.upc.jtigers.svpn.web.common.RequestMappingConstant;
import pe.edu.upc.jtigers.svpn.web.common.ResponseViewConstant;

@Controller
public class PlanNegocioController extends BaseController {
	@Autowired
	private PlanNegocioService planNegocioService;
	@Autowired
	private SabioService sabioService;
	@Autowired
	private CategoriaService categoriaService;

	@ModelAttribute("categorias")
	public Collection<Categoria> getCategorias() {
		return categoriaService.listarCategorias();
	};

	@RequestMapping(RequestMappingConstant.LISTA_PLAN)
	public ModelAndView listaPlan(@RequestBody FiltroPlanBean plan) {

		Collection<PlanNegocio> colPlan = planNegocioService
				.buscarPlanNegocio(plan);
		ModelAndView respuesta = new ModelAndView(
				ResponseViewConstant.VIEW_LISTA_PLAN, "planes", colPlan);
		return respuesta;
	}

	@RequestMapping(RequestMappingConstant.DETALLE_PLAN)
	public ModelAndView detallePlan(@RequestBody int id) {

		PlanNegocio plan = planNegocioService.obtenerPlanNegocio(id);
		ModelAndView respuesta = new ModelAndView(obtenerVistaDetallePlan(),
				"plan", plan);
		return respuesta;
	}

	@RequestMapping(RequestMappingConstant.NUEVO_PLAN)
	public ModelAndView nuevoPlan(@RequestBody int idSabio) {
		PlanNegocio plan = new PlanNegocio();
		if (this.getUsuarioLogueado().getTipoUsuario()
				.equals(TipoUsuarioConstans.SABIO)) {
			idSabio = this.getUsuarioLogueado().getIdUsuario();
		}
		plan.setSabio(sabioService.obtenerSabio(idSabio));
		ModelAndView respuesta = new ModelAndView(
				ResponseViewConstant.VIEW_EDITA_PLAN, "plan", plan);
		return respuesta;
	}

	private String obtenerVistaDetallePlan() {
		String vista = "";

		if (this.getUsuarioLogueado().getUltimoMenuVisitado().getIdMenu() == MenuConstans.VALIDA_PLAN
				|| this.getUsuarioLogueado().getTipoUsuario()
						.equals(TipoUsuarioConstans.EMPRENDEDOR)) {
			vista = ResponseViewConstant.VIEW_DETALLE_PLAN;
		} else {
			vista = ResponseViewConstant.VIEW_EDITA_PLAN;
		}

		return vista;
	}

	@RequestMapping(RequestMappingConstant.DESCARGAR_PLAN)
	public void descargarFichero(int id, final HttpServletResponse response) {
		PlanNegocio plan = planNegocioService.obtenerPlanNegocio(id);
		if (plan != null && plan.getRutaArchivo() != null) {

			File file = new File(plan.getRutaArchivo());
			response.setHeader("Content-Disposition", "attachment;filename="
					+ file.getName().replace(" ", "_"));
			response.setContentType("text/plain");

			try {
				if (file.exists()) {
					FileInputStream fileIn = new FileInputStream(file);
					IOUtils.copy(fileIn, response.getOutputStream());
					response.flushBuffer();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	@RequestMapping(RequestMappingConstant.REGISTRAR_PLAN)
	@ResponseBody
	public PlanNegocio registrarPlan(@RequestBody PlanNegocio plan) {

		plan = planNegocioService.registrarPlanNegocio(plan);
		return plan;
	}
}
